# -*- coding: utf-8 -*-
######
#
# archivo.py
# 
# Clase para leer/escribir información en archivos. 
#
# Alejandra Josué 11496
# Benito Maza 11088
# Jorge Lainfiesta 11142
# 19/Abr/2011
#
######

class archivo:
   
   #Constructor. Hace una lista con los contenidos del archivo.
   def __init__(self, url, sep=","):
      import os
      
      self.content = []
      self.url = url
      self.sep = sep
      self.curLine = -1
      
      #Intentamos leer del archiv, si existe
      if(os.path.isfile(url)): #comprueba si existe
         archivo = open(url, "r")
         try:
            for line in archivo:
               nuevo = line.split(sep)
               cleaned = []
               for n in nuevo:
                  cleaned.append(self.clean(n))
               self.content.append(cleaned)
         except:
            pass
         finally:
            archivo.close()


   #Retorna la 'fila' que toca leer del archivo.
   def read(self):
      self.curLine+=1
      if(self.curLine>=len(self.content)):
         return None
      else:
         return self.content[self.curLine]
   

   #Recibe el número de 'fila' a leer. Retorna la fila si existe, y None si no.
   def readLine(self, row):
      """int row"""
      if(line>=len(self.content)):
         return None
      else:
         return self.content[row]
   
   #Devuelve la última 'fila' del documento.
   def readLast(self):
      if(len(self.content)>0):
         return self.content[-1]
      else:
         return None
   
   #Recibe el contenido de la fila, puede ser list o String. Lo guarda en el archivo.
   def write(self, row):
      self.content.append(row)
      self.update()
   
   #Escribe la lista actual en el archivo
   def update(self):
      strContent = self.listToStr(self.content)
      
      escribir = open(self.url,"w")
      try:
         i = 0
         for line in strContent:
            escribir.write(line+"\n")
         #escribir.writelines(strContent)
      except:
         print "Ha habido un error al guardar el archivo."
      finally:
         escribir.close()
   
   def find(self, objeto, columna):
      contador=[] #Guarda las listas con elementos buscados
      for i in range(len(self.content)):
         lista_temporal=self.content[i][0:]
         if lista_temporal[columna]==objeto:
             contador.append(lista_temporal[0:])
      if(len(contador)>0):
         return contador
      else:
         return None
   
   # def delete(self, objeto, columna):
   #       contador=[] #Guarda las listas que se quieren conservar
   #       for i in range (len(self.content)-1):
   #          lista_temporal=self.content[i][0:]
   #          if lista_temporal[columna]!=objeto:
   #              contador.append(lista_temporal[0:])
   #          else:
   #              break
   #       self.content=contador[:]
   #       return none
   
   #Recibe una lista de listas. Retorna una String de la lista.
   def listToStr(self, tabla):
      strList = []
      for row in tabla:
         if(type(row)==type([])):    
            i = 0
            result = ""
            for col in row:
               if(i==0):
                  result+=str(col)
               else:
                  result+=self.sep+str(col)
               i+=1
            strList.append(result)
         else:
            strList.append(str(row))
      return strList
   
   #Retorna una lista de las propiedades prop del archivo
   def listProper(self, prop):
      ids = []
      for item in self.content:
         ids.append(item[prop])
      return ids
   
   #Recibe un string, le quita las ocurrencias de \n y lo retorna.
   def clean(self, stringo):
      stringo = stringo.replace("\n", "")
      return stringo